package com.newupbank.many2many;

import com.alibaba.fastjson.JSON;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;


/****
 * @Author: liminghui
 * @Date: 2019/12/2 22:15
 * @Version: 1.0
 * @Description:
 * 源数据：
 * 【男，女】
 * 【1】
 * 【a,b】
 * 最后结果：
 * 男    1   a
 * 女    1   a
 * 男    1   b
 * 女    1   b
 **/
public class More2More {
    public static void main(String[] args) {
        //1.构造源数据
        Object[] arr0 = new Object[4];

        ArrayList<String> l1 = new ArrayList<>();
        l1.add("男");
        l1.add("女");
        l1.add("女1");
        ArrayList<String> l2 = new ArrayList<>();
        l2.add("1");
        ArrayList<String> l3 = new ArrayList<>();
        l3.add("a");
        l3.add("b");
        ArrayList<String> l4 = new ArrayList<>();
        l4.add("c");
        l4.add("d");
        arr0[0] = l1;
        arr0[1] = l2;
        arr0[2] = l3;
        arr0[3] = l4;
        List<String[]> decompose = decompose(arr0);

        for (String[] strings : decompose) {
            System.out.println(JSON.toJSONString(strings));

        }
        System.out.println(decompose.size());


    }

    public static List<String[]> decompose(Object[] arr0) {
        //2.把TempPojo放入队列
        Queue<TempPojo> queue = new LinkedList<TempPojo>();
        TempPojo tempPojo = new TempPojo();
        tempPojo.setStep(0);
        tempPojo.setPojoArr(arr0);
        queue.add(tempPojo);

        //存放结果的集合
        List<String[]> resultList = new ArrayList<>();

        //3.遍历队列
        while (queue.size() > 0) {
            TempPojo tempPojo1 = queue.poll();

            int step = tempPojo1.getStep();
            Object[] pojoArr = tempPojo1.getPojoArr();

            //3.1步长与初始集合长度相同，已经拆解到最后一个集合.拆解后将结果放入resultList
            if (step == pojoArr.length - 1) {

                List<String> tempList1 = (List<String>) pojoArr[step];//拿到最后一个集合
                for (String str1 : tempList1) {
                    //拆解最后一个集合并放入结果集合【男，1，a】
                    String[] arrStr = new String[pojoArr.length];
                    for (int i = 0; i < pojoArr.length; i++) {
                        if (i == step) {
                            arrStr[i] = str1;
                        } else {
                            arrStr[i] = (String) pojoArr[i];
                        }
                    }
                    resultList.add(arrStr);
                }

            }

            //3.2如果步长小于初始集合长度，拆解后，构建pojo并加入队列.
            if (step < pojoArr.length- 1) {
                List<String> tempList1 = (List<String>) pojoArr[step];//拿到step对应要拆解的集合
                for (String str1 : tempList1) {
                    TempPojo tempPojo2 = new TempPojo();

                    Object[] objArr = new Object[pojoArr.length];
                    for (int i = 0; i < pojoArr.length; i++) {
                        if (i == step) {
                            objArr[i]=str1;
                        } else {
                            objArr[i]=pojoArr[i];
                        }
                    }
                    tempPojo2.setStep((step + 1));
                    tempPojo2.setPojoArr(objArr);
                    queue.add(tempPojo2);
                }


            }

        }

      return resultList;
    }
}
